/*package poo.recursion;

public class AlberoBinarioDiRicerca <T extends Comparable<? super T>> implements CollezioneOrdinata<T>{

	private static class Albero<E>{
		E info;
		Albero<E> figlioSinistro, figlioDestro;
	}//Albero
	
	private Albero<T> radice = null;
	
	//metodi pubblici di interfaccia - alcuni rimandano a metodi privati ricorsivi
	public int size(){
		return size(radice);
	}//size
	
	public boolean contains (T elem){
		return contains (radice, elem);
	}//contains
	
	public T get(T elem){
		return get(radice, elem);
	}//get
	
	public void clear(){
		radice=null;
	}//clear
	
	public boolean isEmpty(){
		return radice==null;
	}//isEmpty
	
	public boolean isFull(){
		return false;
	}//isFull
	
	public void add(T elem){
		radice=add(radice, elem);
	}//add
	
	public void remove(T elem){
		radice=remove(radice, elem);
	}//remove
	
	@SuppressWarnings("unchecked")
	public boolean equals(Object x){
		if(!(x instanceof AlberoBinarioDiRicerca)) return false;
		if(x==this) return true;
		return equals(this.radice, ((AlberoBinarioDiRicerca)x).radice);
	}//equals
	
	public String toString(){
		StringBuilder sb = new StringBuilder(200);
		sb.append('[');
		toString(radice,sb);
		if(sb.charAt(sb.length()-1)==' ') sb.setLength(sb.length()-2);//rimuove ultimo separatore ","
		sb.append(']');
		return sb.toString();
	}//toString
	
	public int hashCode(){
		return hashCode(radice);
	}//hashCode
	
	public void visitaSimmetrica(){
		visitaSimmetrica(radice);
	}//visitaSimmetrica
	
	public void visitaSimmetrica(List<T> l){
		visitaSimmetrica(radice, l);
	}//visitaSimmetrica
	
	//metodi privati ricorsivi
	private int size(Albero<T> radice){
		if(radice==null) return 0;
		return 1+size(radice.figlioSinistro)+size(radice.figlioDestro);
	}//size
	
	private boolean contains(Albero<T> radice, T elem){
		if(radice==null) return false;
		if(radice.info.equals(elem)) return true;
		if(radice.info.compareTo(elem)>0) return contains(radice.figlioSinistro, elem);
		return contains(radice.figlioDestro, elem);
	}//contains
	
	private T get(Albero<T> radice, T elem){
		if(radice==null) return null;
		if(radice.info.equals(elem)) return radice.info;
		if(radice.info.compareTo(elem)>0) return get(radice.figlioSinistro, elem);
		return get(radice.figlioDestro, elem);
	}//get
	
	private Albero<T> add(Albero<T> radice, T elem){
		if(radice==null){
			radice=new Albero<T>();
			radice.info=elem;
			radice.figlioSinistro=null;
			radice.figlioDestro=null;
			return radice;
		}
		if(radice.info.compareTo(elem)>=0){
			radice.figlioSinistro=add(radice.figlioDestro, elem);
			return radice;
		}
		radice.figlioDestro=add(radice.figlioDestro, elem);
		return radice;
	}//add
	
	
}
*/